package com.tools.s7.map;


public class LatLngUtils {

    private static final double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

    public static SLatLng GCJ02toBD09(SLatLng latLng) {
        double z = Math.sqrt(latLng.getLng() * latLng.getLng() + latLng.getLat() * latLng.getLat())
                + 0.00002 * Math.sin(latLng.getLat() * x_pi);
        double theta = Math.atan2(latLng.getLat(), latLng.getLng()) + 0.000003 * Math.cos(latLng.getLng() * x_pi);
        latLng.setLat(z * Math.sin(theta) + 0.006);
        latLng.setLng(z * Math.cos(theta) + 0.0065);
        return latLng;
    }

    public static SLatLng BD09toGCJ02(SLatLng latLng) {
        double x = latLng.getLng() - 0.0065;
        double y = latLng.getLat() - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
        latLng.setLat(z * Math.sin(theta));
        latLng.setLng(z * Math.cos(theta));
        return latLng;
    }

    public static double getDistance(SLatLng start, SLatLng end) {

        double startLat = (Math.PI / 180) * start.getLat();
        double endLat = (Math.PI / 180) * end.getLat();
        double startLng = (Math.PI / 180) * start.getLng();
        double endLng = (Math.PI / 180) * end.getLng();
        double R = 6371;
        double d = Math.acos(Math.sin(startLat) * Math.sin(endLat) + Math.cos(startLat)
                * Math.cos(endLat) * Math.cos(endLng - startLng)) * R;

        return d * 1000;
    }
}
